// function Food() {
//   this.type = 'food'
// }

// Food.prototype.getType = function() {
//   return this.type
// }

// function Vegetables (name) {
//   this.name = name
// }

// Vegetables.prototype = new Food()
// const tomato = new Vegetables('tomato')
// console.log(tomato.getType());

// class Parent {
//   constructor(name) {
//     this.name = name
//   }
//   getName() {
//     return this.name
//   }
// }

// class Child extends Parent {
//   constructor (name, age) {
//     super(name)
//     this.age = age
//   }
// }

// const c = new Child('lison', 18)
// console.log(c);
// console.log(c.getName());
// console.log(c instanceof Child);

// Object.getPrototypeOf 方法返回指定对象的原型  给定对象的原型。如果没有继承属性，则返回 null
// console.log(Object.getPrototypeOf(Child) === Parent); 

// super关键字用于访问和调用一个对象的父对象上的函数。
// super作为函数  子类一定要调用super() 代表父类的constructor的构造函数
// super作为对象 调用父类上的静态方法
   // 在普通方法中 -》 父类的原型对象
   // 在静态方法中 -》 父类

// class Rectangle {
//   constructor() {}
//   static logNbSides() {
//     return 'I have 4 sides';
//   }
// }

// class Sqquare extends Rectangle {
//   constructor() {}
//   static logDescrption () {
//     return super.logNbSides() + ' which are all equal';
//   }
// }
// console.log(Sqquare.logDescrption());

// class Parent {
//   constructor() {
//     this.type = 'Parent'
//   }
//   getName() {
//     return this.type
//   }
// }
// Parent.getType = () => {
//   return 'is parent'
// }

// class Child extends Parent {
//   constructor () {
//     super()
//     console.log('constructor: ' + super.getName());
//   }
//   getParentName () {
//     console.log('getParentName: ' + super.getName());
//   }
//   // getParentType () {
//   //   console.log('getParentName: ' + super.getType());
//   // }

//   static getParentType () {
//       console.log('getParentName: ' + super.getType());
//     }
// }
// const c = new Child()
// c.getParentName()
// Child.getParentType() // 加静态方法可以直接调用
//  // c.getParentType() // 报错，super只能调用父级的原型上的方法， 不能调用父级的本身方法

// class Parent {
//   constructor() {
//     this.name = 'parent'
//   }
//   print() {
//     console.log(this.name);
//   }
// }

// class Child extends Parent {
//   constructor() {
//     super()
//     this.name = 'child'
//   }
//   childPrint() {
//     super.print()
//   }
// }

// const c = new Child()
// c.childPrint()

// prototype 
// __proto__

var objs = new Object()
console.log(objs.__proto__ === Object.prototype);  // ture

// 子类的__proto__指向父类本身
// 子类的prototype属性的__proto__指向父类的prototype属性
// 实例的__proto__属性的__proto__指向父类实例的__proto__

class CustomArray extends Array {
  constructor(...args) {
    super(...args)
  }
}

const arr = new CustomArray(3)   // 如果是一个参数则是数组的长度， 多个参数为直接数组
arr.fill('abc')
console.log(arr);

const arr2 =new CustomArray(2, 3, 4)
console.log(arr2);